package pl.edu.mimuw.mas.chart;

import java.io.Serializable;

/**
 * Główny obiekt reprezentujacy powierzchnie.
 */
public class Chart implements Serializable {
	private static final long serialVersionUID = 6678413442461220627L;
	private static final float DEFAULT_DISTANCE = 1.0f;
	private float[][] grid;
	private float distance;
	private int columns, rows;

	/**
	 * Sprawdza, czy punkt (x, y) znajduje się na mapie z columns kolumnami
	 * i rows wierszami
	 * @param x pierwsza współrzędna pozycji
	 * @param y druga współrzędna pozycji
	 * @param columns liczba kolumn
	 * @param rows liczba wiersz
	 * @return prawda jeśli punkt (x, y) jest na mapie o podanych wymiarach; false wpp.
	 */
	public static boolean isOnChart(int x, int y, int columns, int rows) {
		return x >= 0 && y >= 0 && x < columns && y < rows;
	}


	/**
	 * Konstruktor
	 * @param columns liczba kolumn
	 * @param rows liczba wierszy
	 * @param distance odległość pomiędzy punktami
	 */
	public Chart(int columns, int rows, float distance) {
		this.grid = new float[columns][rows];

		this.columns = columns;
		this.rows = rows;
		this.distance = distance;
	}

	/**
	 * Konstruktor
	 * @param columns liczba kolumn
	 * @param rows liczba wierszy
	 */
	public Chart(int columns, int rows) {
		this(columns, rows, DEFAULT_DISTANCE);
	}

	/**
	 * Konstruktor
	 * @param columns liczba kolumn
	 * @param rows liczba wierszy
	 * @param distance odległość
	 * @param grid zawartość mapy
	 */
	public Chart(int columns, int rows, float distance, float[][] grid) {
		this(columns, rows, distance);
		this.grid = grid;
	}

	/**
	 * Konstruktor
	 * @param columns liczba kolumn
	 * @param rows liczba wierszy
	 * @param grid zawartość mapy
	 */
	public Chart(int columns, int rows, float[][] grid) {
		this(columns, rows, DEFAULT_DISTANCE);
		this.grid = grid;
	}

	/**
	 * Sprawdza, czy punkt (x, y) jest na mapie 
	 * @param x pierwsza współrzędna punktu
	 * @param y druga współrzędna punktu
	 * @return prawda jeśli punkt (x, y) jest na mapie
	 */
	public boolean isOnChart(int x, int y) {
		return x >= 0 && y >= 0 && x < columns && y < rows;
	}

	
	public int getColumnsCount() {
		return columns;
	}

	public int getRowsCount() {
		return rows;
	}

	public float getDistance() {
		return distance;
	}

	public float getHeight(int column, int row) {
		return grid[column][row];
	}

	public synchronized void setHeight(int col, int row, float height) {
		grid[col][row] = height;
	}

	public synchronized void setColumnHeight(int column, float[] data) {
		if (data.length == rows) {
			for (int i = 0; i < data.length; i++) {
				grid[column][i] = data[i];
			}
		}
	}

	public synchronized void setRowHeight(int row, float[] data) {
		if (data.length == columns) {
			for (int i = 0; i < data.length; i++) {
				grid[i][row] = data[i];
			}
		}
	}

	public String getInfo() {
		return "Mapa - wiersze: " + rows + " kolumny: " + columns;
	}
}
